package com.chain.qs.modules.sys.utils;

import com.google.common.collect.Lists;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * 目录树工具集     Formatting
 * Created by yangx on 16/3/9.
 */
public class TreeUtils {
    /**
     * @param mapList 等待处理的数据
     * @param pValue  查询的父节点起点
     * @param level   从该父节点向下查询几层  小于零，表示查询全部
     * @return
     */
    public static List<Map<String, Object>> getFormatting(List<Map<String, Object>> mapList, String pValue, int level) {
        if (mapList == null) {
            return null;
        }
        if (pValue == null) {
            pValue = "";
        }

        List<Map<String, Object>> map = Lists.newArrayList();
        map = mapList;
        return handle(map, pValue, level);
    }

    /**
     * @param mapList 等待处理的数据
     * @param pValue  查询的父节点起点
     * @return
     */
    public static List<Map<String, Object>> getFormatting(List<Map<String, Object>> mapList, String pValue) {
        if (mapList == null) {
            return null;
        }
        if (pValue == null) {
            pValue = "";
        }

        List<Map<String, Object>> map = Lists.newArrayList();
        map = mapList;
        return handle(map, pValue, -1);
    }

    /**
     * 处理数据
     *
     * @param map     等待处理的数据
     * @param pString 查询的父节点起点
     * @param level   从该父节点向下查询几层  小于零，表示查询全部
     * @return
     */
    public static List<Map<String, Object>> handle(List<Map<String, Object>> map, String pString, int level) {
        //返回上一层的MAP
        List<Map<String, Object>> retMap = Lists.newArrayList();
//        判断本将查询，是否查询到LIST数据
        boolean isNull = true;

        if (pString == null || pString.length() == 0) {
            return null;
        }
        if (level == 0) {
            return null;
        }
        for (Iterator<Map<String, Object>> i = map.iterator(); i.hasNext(); ) {
            Map<String, Object> o = i.next();
            String id = "";
            String pId = "";
            boolean isAdd = false;
            //第一种 用for循环的方式
            for (Map.Entry<String, Object> m : o.entrySet()) {
                if ("pId".equals(m.getKey()) && (!pString.equals(m.getValue()))) {//当pId不符合条件时，就不需要遍历出map中的ID值。直接跳出这层的MAP就可
                    break;
                } else if ("pId".equals(m.getKey()) && pString.equals(m.getValue())) {//当pId符合条件时，需要遍历出map中的ID值
                    isAdd = true;
                    try {
                        pId = m.getValue() + "";
                    } catch (Exception e) {
                    }
                } else if ("id".equals(m.getKey())) {
                    try {
                        id = m.getValue() + "";
                    } catch (Exception e) {
                    }
                } else if ("name".equals(m.getKey().toLowerCase())) {
                    o.put("text", m.getValue());
                }
            }
            if (isAdd) {
                List<Map<String, Object>> retMap123 = handle(map, id, level - 1);
                if (retMap123 != null) {
                    o.put("nodes", retMap123);
                }
                if (retMap123 != null) {
                    o.put("children", retMap123);
                }
                isNull = false;
                retMap.add(o);

            }
        }
        if (isNull) {
            return null;
        } else {
            return retMap;
        }
    }
}
